﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Microsoft.Practices.ObjectBuilder;
using Bovespa.Infra.Web.Security;
using Bovespa.Infra.Web.UI;
using Bovespa.Sinacor.BaseConhecimento.Shell.Presenters;
using Bovespa.Infra.Web.UI.WebControls.Base;
using Bovespa.Infra.ExceptionHandling;
using Bovespa.Sinacor.BaseConhecimento.Shell.ProdutoProxy;

/// <summary>
/// Classe publica de manipulacao da pagina CadastroProduto.aspx
/// </summary>
public partial class CadastroProduto : BovespaPage<CadastroProdutoPresenter>, ICadastroProduto
{
    #region Campos

    #endregion

    #region Propriedades

    /// <summary>
    /// Retorna/Atribui valor para o presenter desta view.
    /// </summary>
    [CreateNew]
    public override CadastroProdutoPresenter Presenter
    {
        get { return this.BasePresenter; }
        set
        {
            this.BasePresenter = value;
            this.BasePresenter.View = this;
        }
    }

    #endregion

    #region Eventos

    /// <summary>
    /// Inicializa informacoes da CadastroProduto, fazendo chamada ao presenter.
    /// </summary>
    /// <remarks>
    /// Este metodo e chamado automaticamente na primeira vez (apenas!) 
    /// que a CadastroProduto e carregada.
    /// </remarks>
    protected override void InitializeView()
    {
        this.Presenter.OnViewInitialized();
    }

    /// <summary>
    /// Carrega informacoes iniciais da View e faz chamada ao presenter 
    /// </summary>
    /// <remarks>
    /// Este metodo e executado automaticamente toda vez que a CadastroProduto (Pagina)
    /// e carregada.
    /// </remarks>
    protected override void LoadView()
    {
        this.Presenter.OnViewLoaded();

        if (!IsPostBack)
        {
            ConsultarProdutoPorHierarquia();  
        }  
    }

    /// <summary>
    /// Evento executado ao clicar no botao de salvar
    /// </summary>
    protected void btnSalvar_Click(object sender, System.EventArgs e)
    {
        InserirProduto();
    }

    #endregion

    #region Metodos Privados

    /// <summary>
    /// Persiste uma entidade de negocio "Produto".
    /// </summary>    
    private void InserirProduto()
    {
        try
        {
            if (string.IsNullOrEmpty(TxtProduto.Text))
            {
                this.ShowMessage("Erro", "O Nome do Produto é Obrigatório!");
                return;
            }

            Produto produto = new Produto();
            produto.Nome = this.TxtProduto.Text;
            produto.CodigoPai = this.ChkProdutoFilho.Checked ? int.Parse(this.CboProdutoPai.SelectedItem.Value) : (int?)null;
            this.Presenter.InserirProduto(produto);
            this.ShowMessage("Sucesso", "Produto incluído com sucesso!");
            LimparCampos();
        }
        catch (BusinessException buEx)
        {
            this.ShowMessage(buEx);
        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
            this.ChkProdutoFilho.Checked = false;
        }
    }

    /// <summary>
    /// Recupera uma lista de entidades de negocio "Produto" por hierarquia.
    /// </summary>
    private void ConsultarProdutoPorHierarquia()
    {
        try
        {
            this.CboProdutoPai.DataSource = this.Presenter.ConsultarProdutoPorHierarquia();
            CboProdutoPai.DataTextField = "Nome";
            CboProdutoPai.DataValueField = "Codigo";
            CboProdutoPai.DataBind();
        }
        catch (BusinessException buEx)
        {
            this.ShowMessage(buEx);
        }
        catch (Exception ex)
        {
            throw;
        }
    }

    /// <summary>
    /// Limpar campos da tela.
    /// </summary>
    private void LimparCampos()
    {
        TxtProduto.Text = "";
        ChkProdutoFilho.Checked = false;
        CboProdutoPai.SelectedIndex = 0;
    }

    #endregion

    #region ICadastroProduto Members

    #endregion
}


